#!/usr/bin/env python
# coding:utf8

"""
包含了一些在web中开发使用的TOTP双重因子验证等函数，可以结合谷歌的authenticator app使用
其中使用pyotp模块是最简单和方便的实现
"""

import hmac
import base64
import struct
import hashlib
import time
# from random import choice
# import string
import pyotp
import random
from qrcode import QRCode


def get_hotp_token(secret, intervals_no):
	key = base64.b32decode(secret, True)
	msg = struct.pack(">Q", intervals_no)
	h = hmac.new(key, msg, hashlib.sha1).digest()
	o = ord(h[19])& 15
	h = (struct.unpack(">I", h[o:o+ 4])[0]& 0x7fffffff)% 1000000
	return h


def get_totp_token(secret):
	return get_hotp_token(secret, intervals_no=int(time.time())// 30)


# 随机密码生成器
# def GenPassword(length=10, chars=string.ascii_letters.lower()+string.digits):
# return ''.join([choice(chars) for i in range(length)])


# 生成二维码的函数
def get_qrcode(data, *args, **kwargs):
	qr = QRCode(*args,**kwargs)
	qr.add_data(data)
	im = qr.make_image()
	im.show()


# 生成随机google-authenticator密钥的函数
def random_base32(length=16,random=random.SystemRandom(),chars=base64._b32alphabet.values()):
	return ''.join(random.choice(chars) for i in xrange(length))


def main():
	gtoken = pyotp.random_base32() # google token value
	print gtoken

	t = pyotp.TOTP(gtoken)
	print "使用pyotp:"
	print t.now() # 使用pyotp更简单

	print "使用自定义函数："
	print get_totp_token(gtoken)

	email = "xyz@xyz.com"
	# 将内容放入二维码
	get_qrcode(email)

	print random_base32()


if __name__ =='__main__':
	main()


# SN号必须为字母和数字的16位混合码
